Skip to content

Add files.sync_from_url + spec bump to v0.7.5 - #63

Merged
kdr merged 1 commit into
mainfrom
kdrv075
Jun 12, 2026
Merged

Add files.sync_from_url + spec bump to v0.7.5#63
kdr merged 1 commit into
mainfrom
kdrv075

Conversation

@kdr

@kdr kdr commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Summary

Bumps the SDK to 0.7.12 on spec v0.7.5 (cloudglue-api-spec#99, merged — submodule pinned to main commit 7ecd8ae) and regenerates the low-level SDK, which adds the sync_file_from_url method for the new POST /files/sync endpoint. Python counterpart of cloudglue-js#131.

New: Files.sync_from_url()

Materializes a publicly accessible URL into a Cloudglue file without a data connector or collection — direct media URLs, public Dropbox share links, TikTok (consumes scrape credits), and Loom share URLs. Idempotent: re-syncing the same URL returns the existing file. Follows the existing upload() pattern, including wait_until_finish / poll_interval / timeout support.

file = client.files.sync_from_url(
    "https://media.cloudglue.dev/test-data/bbq.mp4",
    metadata={"project": "demo"},
    wait_until_finish=True,
)

DataConnectors.sync_file docstring refresh

Documents the API 0.7.5 URL-handling changes: Drive file/d/open?id= links, Dropbox scl/fi/s file share links (resolved via connector OAuth, works for login-gated files), and best-effort Zoom rec/share links (with the reliable recording-detail-link guidance), plus the new 403/429 error statuses. Routes plain/TikTok/Loom URLs to files.sync_from_url and YouTube to collections.add_media.

Scope note

Unlike cloudglue-js, this SDK has no client-side URL normalization/routing layer (that's a JS-only feature from cloudglue-js#129) — Loom URLs must be in canonical www.loom.com/share/<id> form, and unsupported URLs are rejected server-side with the API's specific 400s rather than client-side.

Verification

Ran live against the API with a smoke-test script (fresh state — previous test files deleted first):

  • files.sync_from_url: direct .mp4, TikTok, and Loom URLs all freshly ingested to completed; idempotent re-sync returned the same file ID; wait_until_finish=True round trip returned a terminal state
  • Server-side rejections confirmed: YouTube, s3://, and Zoom rec/share URLs all 400 on POST /files/sync
  • data_connectors.sync_file: Drive share link and Dropbox scl/fi share link both synced to completion through their connectors; Zoom rec/share returned the documented best-effort 404 guidance (stale token)

Note

Low Risk
Mostly additive client/SDK and documentation changes; behavior depends on the new API endpoint with no changes to auth or existing upload paths.

Overview
Bumps the Python package to 0.7.12 and regenerates the OpenAPI client for API 0.7.5, including the new POST /files/sync surface (SyncFileFromUrlRequest, FilesApi.sync_file_from_url).

The high-level client adds Files.sync_from_url() to ingest public media without a connector or collection (direct http(s) files, Dropbox/TikTok/Loom links), with optional metadata and segment thumbnails and the same wait_until_finish polling pattern as upload(). DataConnectors.sync_file docstrings are expanded for share-link support, idempotency, which URLs belong on connector sync vs files.sync_from_url vs collections, and additional documented errors (403, 429).

Reviewed by Cursor Bugbot for commit c21f4ce. Bugbot is set up for automated code reviews on this repo. Configure here.

Spec submodule moved to v0.7.5 (cloudglue-api-spec#99) and SDK
regenerated, adding the sync_file_from_url low-level method. Wrapper
changes:

- New Files.sync_from_url(url, metadata=None,
  enable_segment_thumbnails=None, wait_until_finish=False, ...)
  materializes a public URL (direct media, public Dropbox share links,
  TikTok, Loom) into a file, following the upload() polling pattern.
  Idempotent server-side.
- DataConnectors.sync_file docstring updated for the newly accepted
  share-link forms (Drive file/open links, Dropbox scl/fi and /s/ file
  share links via connector OAuth, Zoom rec/share best-effort with
  recording-detail guidance) and the new error statuses (403/429),
  routing plain/TikTok/Loom URLs to files.sync_from_url and YouTube to
  collections.add_media.

Unlike cloudglue-js, this SDK has no client-side URL normalization
layer; URL classification and rejection happen server-side.

Verified live: sync_from_url for direct/TikTok/Loom URLs (fresh
ingestion + idempotent re-sync + wait_until_finish round trip),
server-side 400s for YouTube/s3/zoom links, connector sync of Drive and
Dropbox share links to completion, and Zoom rec/share returning the
documented best-effort 404 guidance.
@coderabbitai

coderabbitai Bot commented Jun 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 275 files, which is 125 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3aab56ee-90a6-4c66-889c-0b774b17b817

📥 Commits

Reviewing files that changed from the base of the PR and between e9dc124 and c21f4ce.

📒 Files selected for processing (275)
  • cloudglue/client/resources/data_connectors.py
  • cloudglue/client/resources/files.py
  • cloudglue/sdk/README.md
  • cloudglue/sdk/__init__.py
  • cloudglue/sdk/api/chat_api.py
  • cloudglue/sdk/api/collections_api.py
  • cloudglue/sdk/api/data_connectors_api.py
  • cloudglue/sdk/api/deep_search_api.py
  • cloudglue/sdk/api/describe_api.py
  • cloudglue/sdk/api/extract_api.py
  • cloudglue/sdk/api/face_detection_api.py
  • cloudglue/sdk/api/face_match_api.py
  • cloudglue/sdk/api/file_segments_api.py
  • cloudglue/sdk/api/files_api.py
  • cloudglue/sdk/api/frames_api.py
  • cloudglue/sdk/api/response_api.py
  • cloudglue/sdk/api/search_api.py
  • cloudglue/sdk/api/segmentations_api.py
  • cloudglue/sdk/api/segments_api.py
  • cloudglue/sdk/api/share_api.py
  • cloudglue/sdk/api/tags_api.py
  • cloudglue/sdk/api/thumbnails_api.py
  • cloudglue/sdk/api/transcribe_api.py
  • cloudglue/sdk/api/webhooks_api.py
  • cloudglue/sdk/api_client.py
  • cloudglue/sdk/configuration.py
  • cloudglue/sdk/exceptions.py
  • cloudglue/sdk/models/__init__.py
  • cloudglue/sdk/models/add_collection_file.py
  • cloudglue/sdk/models/add_you_tube_collection_file.py
  • cloudglue/sdk/models/chapter.py
  • cloudglue/sdk/models/chat_completion_list.py
  • cloudglue/sdk/models/chat_completion_list_data_inner.py
  • cloudglue/sdk/models/chat_completion_list_data_inner_choices_inner.py
  • cloudglue/sdk/models/chat_completion_list_data_inner_usage.py
  • cloudglue/sdk/models/chat_completion_payload.py
  • cloudglue/sdk/models/chat_completion_request.py
  • cloudglue/sdk/models/chat_completion_request_filter.py
  • cloudglue/sdk/models/chat_completion_request_filter_file_inner.py
  • cloudglue/sdk/models/chat_completion_request_filter_metadata_inner.py
  • cloudglue/sdk/models/chat_completion_request_filter_video_info_inner.py
  • cloudglue/sdk/models/chat_completion_response.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner_citations_inner.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner_citations_inner_all_of_end_time.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner_citations_inner_all_of_relevant_sources_inner.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner_citations_inner_all_of_start_time.py
  • cloudglue/sdk/models/chat_completion_response_usage.py
  • cloudglue/sdk/models/chat_message.py
  • cloudglue/sdk/models/collection.py
  • cloudglue/sdk/models/collection_delete.py
  • cloudglue/sdk/models/collection_describe_config.py
  • cloudglue/sdk/models/collection_entities_list.py
  • cloudglue/sdk/models/collection_entities_list_data_inner.py
  • cloudglue/sdk/models/collection_entities_list_data_inner_data.py
  • cloudglue/sdk/models/collection_entities_list_data_inner_data_segment_entities_inner.py
  • cloudglue/sdk/models/collection_extract_config.py
  • cloudglue/sdk/models/collection_face_detection_config.py
  • cloudglue/sdk/models/collection_face_detection_config_frame_extraction_config.py
  • cloudglue/sdk/models/collection_face_detection_config_frame_extraction_config_uniform_config.py
  • cloudglue/sdk/models/collection_face_detection_config_thumbnails_config.py
  • cloudglue/sdk/models/collection_file.py
  • cloudglue/sdk/models/collection_file_delete.py
  • cloudglue/sdk/models/collection_file_list.py
  • cloudglue/sdk/models/collection_file_segmentation.py
  • cloudglue/sdk/models/collection_list.py
  • cloudglue/sdk/models/collection_media_descriptions_list.py
  • cloudglue/sdk/models/collection_media_descriptions_list_data_inner.py
  • cloudglue/sdk/models/collection_media_descriptions_list_data_inner_data.py
  • cloudglue/sdk/models/collection_rich_transcripts_list.py
  • cloudglue/sdk/models/collection_rich_transcripts_list_data_inner.py
  • cloudglue/sdk/models/collection_rich_transcripts_list_data_inner_data.py
  • cloudglue/sdk/models/collection_transcribe_config.py
  • cloudglue/sdk/models/collection_update.py
  • cloudglue/sdk/models/create_deep_search_request.py
  • cloudglue/sdk/models/create_deep_search_request_knowledge_base.py
  • cloudglue/sdk/models/create_file_frame_extraction_request.py
  • cloudglue/sdk/models/create_file_segmentation_request.py
  • cloudglue/sdk/models/create_response_request.py
  • cloudglue/sdk/models/create_response_request_input.py
  • cloudglue/sdk/models/create_shareable_asset_request.py
  • cloudglue/sdk/models/create_video_tag_request.py
  • cloudglue/sdk/models/data_connector.py
  • cloudglue/sdk/models/data_connector_file.py
  • cloudglue/sdk/models/data_connector_file_list.py
  • cloudglue/sdk/models/data_connector_file_metadata.py
  • cloudglue/sdk/models/data_connector_list.py
  • cloudglue/sdk/models/deep_search.py
  • cloudglue/sdk/models/deep_search_error.py
  • cloudglue/sdk/models/deep_search_kb_collections.py
  • cloudglue/sdk/models/deep_search_kb_default.py
  • cloudglue/sdk/models/deep_search_kb_files.py
  • cloudglue/sdk/models/deep_search_list.py
  • cloudglue/sdk/models/deep_search_list_item.py
  • cloudglue/sdk/models/deep_search_result.py
  • cloudglue/sdk/models/deep_search_search_query_plan.py
  • cloudglue/sdk/models/deep_search_usage.py
  • cloudglue/sdk/models/default_segmentation_config.py
  • cloudglue/sdk/models/delete_deep_search_result.py
  • cloudglue/sdk/models/delete_describe200_response.py
  • cloudglue/sdk/models/delete_extract200_response.py
  • cloudglue/sdk/models/delete_face_detection200_response.py
  • cloudglue/sdk/models/delete_face_match200_response.py
  • cloudglue/sdk/models/delete_frame_extraction200_response.py
  • cloudglue/sdk/models/delete_response_result.py
  • cloudglue/sdk/models/delete_segmentation200_response.py
  • cloudglue/sdk/models/delete_segments200_response.py
  • cloudglue/sdk/models/delete_shareable_asset200_response.py
  • cloudglue/sdk/models/delete_tag200_response.py
  • cloudglue/sdk/models/describe.py
  • cloudglue/sdk/models/describe_config.py
  • cloudglue/sdk/models/describe_data.py
  • cloudglue/sdk/models/describe_data_all_of_segment_summary_inner.py
  • cloudglue/sdk/models/describe_describe_config.py
  • cloudglue/sdk/models/describe_list.py
  • cloudglue/sdk/models/describe_output.py
  • cloudglue/sdk/models/describe_output_part.py
  • cloudglue/sdk/models/detected_face.py
  • cloudglue/sdk/models/entity_backed_knowledge_config.py
  • cloudglue/sdk/models/entity_collection_config.py
  • cloudglue/sdk/models/error.py
  • cloudglue/sdk/models/extract.py
  • cloudglue/sdk/models/extract_chapters_inner.py
  • cloudglue/sdk/models/extract_data.py
  • cloudglue/sdk/models/extract_data_segment_entities_inner.py
  • cloudglue/sdk/models/extract_extract_config.py
  • cloudglue/sdk/models/extract_list.py
  • cloudglue/sdk/models/extract_shots_inner.py
  • cloudglue/sdk/models/face_bounding_box.py
  • cloudglue/sdk/models/face_detection.py
  • cloudglue/sdk/models/face_detection_data.py
  • cloudglue/sdk/models/face_detection_list_response.py
  • cloudglue/sdk/models/face_detection_list_response_all_of_data.py
  • cloudglue/sdk/models/face_detection_request.py
  • cloudglue/sdk/models/face_group_result.py
  • cloudglue/sdk/models/face_match.py
  • cloudglue/sdk/models/face_match_data.py
  • cloudglue/sdk/models/face_match_list_response.py
  • cloudglue/sdk/models/face_match_list_response_all_of_data.py
  • cloudglue/sdk/models/face_match_request.py
  • cloudglue/sdk/models/face_match_result.py
  • cloudglue/sdk/models/face_search_result.py
  • cloudglue/sdk/models/file.py
  • cloudglue/sdk/models/file_delete.py
  • cloudglue/sdk/models/file_entities.py
  • cloudglue/sdk/models/file_face_detections.py
  • cloudglue/sdk/models/file_face_detections_faces_inner.py
  • cloudglue/sdk/models/file_face_detections_faces_inner_face_bounding_box.py
  • cloudglue/sdk/models/file_list.py
  • cloudglue/sdk/models/file_media_info.py
  • cloudglue/sdk/models/file_search_result.py
  • cloudglue/sdk/models/file_segment.py
  • cloudglue/sdk/models/file_segment_list_response.py
  • cloudglue/sdk/models/file_segmentation_config.py
  • cloudglue/sdk/models/file_update.py
  • cloudglue/sdk/models/file_video_info.py
  • cloudglue/sdk/models/frame_extraction.py
  • cloudglue/sdk/models/frame_extraction_config.py
  • cloudglue/sdk/models/frame_extraction_data.py
  • cloudglue/sdk/models/frame_extraction_data_frames_inner.py
  • cloudglue/sdk/models/frame_extraction_list.py
  • cloudglue/sdk/models/frame_extraction_list_data_inner.py
  • cloudglue/sdk/models/frame_extraction_thumbnails_config.py
  • cloudglue/sdk/models/frame_extraction_uniform_config.py
  • cloudglue/sdk/models/grain_source_metadata.py
  • cloudglue/sdk/models/grain_source_metadata_ai_action_items_inner.py
  • cloudglue/sdk/models/grain_source_metadata_ai_action_items_inner_assignee.py
  • cloudglue/sdk/models/grain_source_metadata_ai_summary.py
  • cloudglue/sdk/models/grain_source_metadata_calendar_event.py
  • cloudglue/sdk/models/grain_source_metadata_hubspot.py
  • cloudglue/sdk/models/grain_source_metadata_meeting_type.py
  • cloudglue/sdk/models/grain_source_metadata_participants_inner.py
  • cloudglue/sdk/models/grain_source_metadata_teams_inner.py
  • cloudglue/sdk/models/keyframe_config.py
  • cloudglue/sdk/models/knowledge_base_collections.py
  • cloudglue/sdk/models/knowledge_base_default.py
  • cloudglue/sdk/models/knowledge_base_files.py
  • cloudglue/sdk/models/list_video_tags_response.py
  • cloudglue/sdk/models/media_description.py
  • cloudglue/sdk/models/narrative_config.py
  • cloudglue/sdk/models/new_collection.py
  • cloudglue/sdk/models/new_collection_describe_config.py
  • cloudglue/sdk/models/new_collection_extract_config.py
  • cloudglue/sdk/models/new_collection_face_detection_config.py
  • cloudglue/sdk/models/new_collection_transcribe_config.py
  • cloudglue/sdk/models/new_describe.py
  • cloudglue/sdk/models/new_extract.py
  • cloudglue/sdk/models/new_segments.py
  • cloudglue/sdk/models/new_transcribe.py
  • cloudglue/sdk/models/pagination_response.py
  • cloudglue/sdk/models/response.py
  • cloudglue/sdk/models/response_annotation.py
  • cloudglue/sdk/models/response_error.py
  • cloudglue/sdk/models/response_input_content.py
  • cloudglue/sdk/models/response_input_message.py
  • cloudglue/sdk/models/response_knowledge_base.py
  • cloudglue/sdk/models/response_list.py
  • cloudglue/sdk/models/response_list_item.py
  • cloudglue/sdk/models/response_output_content.py
  • cloudglue/sdk/models/response_output_message.py
  • cloudglue/sdk/models/response_tool_definition.py
  • cloudglue/sdk/models/response_usage.py
  • cloudglue/sdk/models/rich_transcript.py
  • cloudglue/sdk/models/search_filter.py
  • cloudglue/sdk/models/search_filter_criteria.py
  • cloudglue/sdk/models/search_filter_file_inner.py
  • cloudglue/sdk/models/search_filter_metadata_inner.py
  • cloudglue/sdk/models/search_filter_video_info_inner.py
  • cloudglue/sdk/models/search_request.py
  • cloudglue/sdk/models/search_request_source_image.py
  • cloudglue/sdk/models/search_response.py
  • cloudglue/sdk/models/search_response_list.py
  • cloudglue/sdk/models/search_response_list_data_inner.py
  • cloudglue/sdk/models/search_response_results_inner.py
  • cloudglue/sdk/models/search_tag_response.py
  • cloudglue/sdk/models/segment.py
  • cloudglue/sdk/models/segment_describe.py
  • cloudglue/sdk/models/segment_describe_data.py
  • cloudglue/sdk/models/segment_describe_json_data.py
  • cloudglue/sdk/models/segment_describe_list_response.py
  • cloudglue/sdk/models/segment_describe_markdown_data.py
  • cloudglue/sdk/models/segment_describe_output_entry.py
  • cloudglue/sdk/models/segment_describe_speech_entry.py
  • cloudglue/sdk/models/segment_group_result.py
  • cloudglue/sdk/models/segment_search_result.py
  • cloudglue/sdk/models/segment_search_result_keyframes_inner.py
  • cloudglue/sdk/models/segment_search_result_scene_text_inner.py
  • cloudglue/sdk/models/segment_search_result_speech_inner.py
  • cloudglue/sdk/models/segment_search_result_visual_description_inner.py
  • cloudglue/sdk/models/segmentation.py
  • cloudglue/sdk/models/segmentation_config.py
  • cloudglue/sdk/models/segmentation_data.py
  • cloudglue/sdk/models/segmentation_data_segments_inner.py
  • cloudglue/sdk/models/segmentation_list.py
  • cloudglue/sdk/models/segmentation_list_item.py
  • cloudglue/sdk/models/segmentation_manual_config.py
  • cloudglue/sdk/models/segmentation_manual_config_segments_inner.py
  • cloudglue/sdk/models/segmentation_shot_detector_config.py
  • cloudglue/sdk/models/segmentation_uniform_config.py
  • cloudglue/sdk/models/segments.py
  • cloudglue/sdk/models/segments_list.py
  • cloudglue/sdk/models/segments_list_item.py
  • cloudglue/sdk/models/shareable_asset.py
  • cloudglue/sdk/models/shareable_asset_list_response.py
  • cloudglue/sdk/models/shot.py
  • cloudglue/sdk/models/shot_config.py
  • cloudglue/sdk/models/source_image.py
  • cloudglue/sdk/models/source_metadata.py
  • cloudglue/sdk/models/source_metadata_response.py
  • cloudglue/sdk/models/speech_output_part.py
  • cloudglue/sdk/models/sync_data_connector_file_request.py
  • cloudglue/sdk/models/sync_file_from_url_request.py
  • cloudglue/sdk/models/thumbnail.py
  • cloudglue/sdk/models/thumbnail_list.py
  • cloudglue/sdk/models/thumbnails_config.py
  • cloudglue/sdk/models/transcribe.py
  • cloudglue/sdk/models/transcribe_data.py
  • cloudglue/sdk/models/transcribe_data_all_of_segment_summary_inner.py
  • cloudglue/sdk/models/transcribe_list.py
  • cloudglue/sdk/models/transcribe_transcribe_config.py
  • cloudglue/sdk/models/update_describe_request.py
  • cloudglue/sdk/models/update_file_segment_request.py
  • cloudglue/sdk/models/update_shareable_asset_request.py
  • cloudglue/sdk/models/update_video_tag_request.py
  • cloudglue/sdk/models/video_tag.py
  • cloudglue/sdk/models/webhook.py
  • cloudglue/sdk/models/webhook_create_request.py
  • cloudglue/sdk/models/webhook_delete_response.py
  • cloudglue/sdk/models/webhook_events.py
  • cloudglue/sdk/models/webhook_list.py
  • cloudglue/sdk/models/webhook_update_request.py
  • cloudglue/sdk/models/word_timestamp.py
  • cloudglue/sdk/rest.py
  • pyproject.toml
  • spec

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch kdrv075

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@kdr
kdr requested a review from amyxst June 12, 2026 17:43
@kdr
kdr merged commit e9c6095 into main Jun 12, 2026
2 checks passed
@kdr
kdr deleted the kdrv075 branch June 12, 2026 18:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants